package com.hmdp.utils;

import cn.hutool.core.bean.BeanUtil;
import com.hmdp.dto.UserDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import java.util.Map;

import static com.hmdp.utils.RedisConstants.LOGIN_USER_KEY;
import static com.hmdp.utils.RedisConstants.LOGIN_USER_TTL;

@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    private final StringRedisTemplate stringRedisTemplate;
    public LoginInterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }
    // 在接口之前执行:
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 判断是否登录
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
     /*  if (user == null) {
           log.debug("没获取到用户session，服务器重启或没登录");
           // 未登录,返回401
           response.setStatus(401);  //体现response的作用了，
           return false;
       };*/
        log.debug("拦截器拦截到请求路径:{}",request.getRequestURI());
        log.debug("根据session获取的用户:{}",user);
        //获取请求的token：
        String token = request.getHeader("authorization");
        log.debug("拦截的token:{}",token);
        //如果token前面有Bearer和空格，去掉：
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }
        //通过token获取redis中的用户:
        Map<Object, Object> entries = stringRedisTemplate.opsForHash().entries(LOGIN_USER_KEY+token);
        log.debug("拦截的用户:{}",entries);
       if (entries.isEmpty()) {  //不能==,
            // 未登录,返回401
            response.setStatus(401);
            return false;
        }
        //刷新token有效期:
        stringRedisTemplate.expire(LOGIN_USER_KEY+token,LOGIN_USER_TTL,java.util.concurrent.TimeUnit.MINUTES);
       //转化为DTO：
        UserDTO userDTO = BeanUtil.fillBeanWithMap(entries, new UserDTO(), false);
        UserHolder.saveUser(userDTO);
        return true;
    }
    /*
    * 在处理器执行完毕、响应已发送给客户端且所有postHandle方法（如果有）都已执行完毕后，
    * Spring MVC会调用HandlerInterceptor的afterCompletion方法。
    * 这个方法常用于清理资源、记录日志、释放特定于请求的上下文信息等收尾工作。
    * */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception{
        //移除用户
        UserHolder.removeUser();
    }

}
